package com.ruoyi.wxorali.utils;
import org.apache.commons.lang3.ObjectUtils;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * list分组
 * @author admin
 */
public class CollectionUtil extends org.apache.commons.collections.CollectionUtils {
    /**
     * 将参数List拆分成多个List，组成每个子list.size()==itemSize新的大List返回。
     * 例如: 传入 List<?> sourceList，返回 List<List<?>>
     *
     * @param source   原始数据集
     * @param itemSize 每个子集的容量
     * @return ArrayList<ArrayList < E>>
     * @throws IllegalArgumentException 参数错误，每个子集容量必须大于0，原始数据集是空集合。
     */
    public static <E> ArrayList<ArrayList<E>> separateList(final List<E> source, final int itemSize) {
        if (ObjectUtils.isEmpty(source)) {
            throw new IllegalArgumentException("参数错误，原始数据集是空集合。");
        }
        if (itemSize <= 0) {
            throw new IllegalArgumentException("参数错误，每个子集容量必须大于0。");
        }
        int initSize = source.size() / itemSize + 1;
        return construcLoopList(new ArrayList<E>(source), new ArrayList<ArrayList<E>>(initSize), itemSize);
    }

    /**
     * 递归拆分
     *
     * @param source   原始数据集
     * @param res      封装结果
     * @param itemSize 每个子集的容量
     */
    private static <E> ArrayList<ArrayList<E>> construcLoopList(
            List<E> source, ArrayList<ArrayList<E>> res, final int itemSize) {

        Iterator<E> it = source.iterator();
        ArrayList<E> loopList = new ArrayList<E>(itemSize);
        int index = 0;
        while (it.hasNext()) {
            E e = it.next();
            loopList.add(e); // 加入一个
            it.remove(); // 直接删除
            index++;
            if (index >= itemSize) {
                // 递归调用, 地址值装配。
                construcLoopList(source, res, itemSize);
            }
        }

        // 递归中的子集数据量大于0再放入父集。
        // 当itemSize为偶数时，最深的一次递归创建了loopList集合，但是迭代器中已经没有数据了。
        // 当itemSize为奇数时，最深的一次递归创建了loopList集合，迭代器会向其中加入最后剩余的数据，剩余数据量<itemSize。
        if (loopList.size() > 0) {
            res.add(loopList);
        }

        return res;
    }





}
